"""
每一个类都默认继承object
子类继承父类后, 会拥有父类中所有的非私有的属性和方法
继承的作用: 从子类来看, 继承可以简化代码, 从父类来看,子类是对父类功能的扩充
"""

# 单继承:优先使用子类中的方法
"""
class A:
    pass
class B(A):
    pass
class C(B):
    pass
"""

"""
多重继承
查找顺序(从左往右) 先找自己然后从左往右依次找父类 class C(A, B)  C-->A-->B-->obj
C类中没有调用的方法时会优先去A类中寻找, A类中没有在B类中寻找,B类没有找object
当继承顺序比较复杂时, 可以使用__mro__属性查看搜索顺序 会返回一个元组
__
"""
"""
class A:
    pass
class B:
    pass
class C(A, B):
    pass
"""

""" isinstance(object, classinfo)
判断obj是不是classinfo的实例对象,或者是不是classinfo的子类的实例对象
object: 实例对象
classinfo: 类名、基本类型或者其他由它们组成的元组
如果object是classinfo的实例或者是其子类的实例,则返回True
如果object不是给定类型的对象, 则返回False
如果classinfo是类型对象元组, 那么如果object是其中任何一个类型的实例或者其子类的实例, 就返回True
如果classinfo既不是类型, 也不是类型元组或类型元组的元组, 则将引发TypeError异常
"""


class A:
    pass


class B(A):
    pass


class C(B):
    pass


#
a, b, c = A(), B(), C()
print(isinstance(b, C))  # False
print(isinstance(a, A))  # true
print(isinstance(b, A))  # true
print(isinstance(c, B))  # true
""" 
issubclass(class,classinfo) 
判断class类是不是classinfo类的子类
这个函数会把class当作是classinfo的子类 例issubclass(X,X) #True
"""

print(issubclass(C, A))
print(issubclass(A, C))

"""
- 所有类都默认继承object, 包括type
- 所有类都是type的实例对象, 包括object
"""